package forth

/*
	输入一棵二叉树的根节点，判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1，那么它就是一棵平衡二叉树。

	示例 1:

	给定二叉树 [3,9,20,null,null,15,7]

		3
	   / \
	  9  20
		/  \
	   15   7
	返回 true 。

	示例 2:

	给定二叉树 [1,2,2,3,3,null,null,4,4]

		   1
		  / \
		 2   2
		/ \
	   3   3
	  / \
	 4   4
	返回false 。

	限制：

	0 <= 树的结点个数 <= 10000
	注意：本题与主站 110题相同：https://leetcode-cn.com/problems/balanced-binary-tree/

	来源：力扣（LeetCode）
	链接：https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof
	著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
func isBalanced(root *TreeNode) bool {
	if nil == root {
		return true
	}
	leftHeight := maxDepth(root.Left)
	rightHeight := maxDepth(root.Right)
	if leftHeight-rightHeight < -1 || leftHeight-rightHeight > 1 {
		return false
	}
	return isBalanced(root.Left) && isBalanced(root.Right)
}

func maxDepth(root *TreeNode) int {
	if nil == root {
		return 0
	}
	return max(maxDepth(root.Left), maxDepth(root.Right)) + 1
}
